(function($){ 
    /**
     * @param style {Object|Function|String}
     * 'float:left;width:20px'
     */
    $.fn.style = function(style){
        var $self = $(this);
        if(!Type.isUndefined(style)){
            //function(), context:$self
            if(Type.isFunction(style)){
                $self.style(style.call($self));
            }                
            //{left:2px, width:3px;}
            if(Type.isObject(style)){
                return $self.css(style);
            } 
            //string : 'left:2px;width:3px;'
            else if(Type.isString(style)) {
                if(style.indexOf(':') > -1){
                    style = style.replace(/^;|;$/gi,'');
                    var styleObj = {};
                    $(style.split(';')).each(function(index, item){
                        var cssItem = item.split(':');
                        styleObj[cssItem[0]] = cssItem[1];                        
                    });
                    $self.style(styleObj);
                } else {
                    $self.addClass(style);    
                }            
            } else{            
            }
        }
        return this;
    };
    
    /**
     * 判断jQuery对象关联的DOM对象是否拥有定位属性.
     */
    $.fn.isPositioned = function(){
       return ['relative', 'absolute', 'fixed'].contains( $(this).css('position') );
    };
    
    /**
     * 使元素闪烁。
     * 颜色渐变效果需要jQuery-ui的支持。
     * @param {String} color
     */
    $.fn.blink = function(color, times) {
        //兼容$ele.blink(times).
        if(typeof color == 'number'){
            times = color;
            color = undefined;    
        }
        
        if(!color){
            color = '#FFFF08';
        }
        if(!times){
            times = 2;
        }
        var $this = this,
            oldBgColor = $this.css('background-color'),
            duration = 400,
            changeFun = function(){
                $this.stop(true).animate({ 'background-color': color }, duration, function(){
                     $this.animate({ 'background-color': oldBgColor }, duration, function(){                     
                         if(--times){                     
                             changeFun();
                         }
                     });
                });        
            };         
        changeFun();
        return this;
    };
    
    /**
     * 为当前元素添加一个Class并去除该元素兄弟元素中的该Class.
     * @param {String} className
     */
    $.fn.addExclusiveClass = function(className){    
        this.addClass(className).siblings().removeClass(className);
        return this;
    };
    
    /**
     * 添加CSS文本或CSS外部文件.
     * opts : {
     *     title : 'jsTree',    //CSS ID.
     *     str : '.tree{color:#ff0000}',
     *     url : '../style.css'
     * }
     */
    $.addStyleSheet = function(opts) {
        var styleSheetTmp = false, is_new = true;
        if (opts.str) {
            if (opts.title) {
                styleSheetTmp = $("style[id='" + opts.title + "-stylesheet']")[0];
            }
            if (styleSheetTmp) {
                is_new = false;
            } else {
                styleSheetTmp = document.createElement("style");
                styleSheetTmp.setAttribute('type', "text/css");
                if (opts.title) {
                    styleSheetTmp.setAttribute("id", opts.title + "-stylesheet");
                }
            }
            if (styleSheetTmp.styleSheet) {
                if (is_new) {
                    document.getElementsByTagName("head")[0].appendChild(styleSheetTmp);
                    styleSheetTmp.styleSheet.cssText = opts.str;
                } else {
                    styleSheetTmp.styleSheet.cssText = styleSheetTmp.styleSheet.cssText + " " + opts.str;
                }
            } else {
                styleSheetTmp.appendChild(document.createTextNode(opts.str));
                document.getElementsByTagName("head")[0].appendChild(styleSheetTmp);
            }
            return styleSheetTmp.sheet || styleSheetTmp.styleSheet;
        }
        if (opts.url) {
            if (document.createStyleSheet) {
                try {
                    styleSheetTmp = document.createStyleSheet(opts.url);
                } catch (e) {}
            } else {
                styleSheetTmp = document.createElement('link');
                styleSheetTmp.rel = 'stylesheet';
                styleSheetTmp.type = 'text/css';
                styleSheetTmp.media = "all";
                styleSheetTmp.href = opts.url;
                document.getElementsByTagName("head")[0].appendChild(styleSheetTmp);
                return styleSheetTmp.styleSheet;
            }
        }
    };
    
    /**
     * 判断元素是否仅应用一个class.
     * @method hasOnlyClass.
     * @param className {String} : CSS类.
     * @return {Boolean}
     */
    $.fn.hasOnlyClass = function(className){
        var isHasOnlyClass = false;
        if(className){
            var clsValue = $(this).attr('class');
            if(clsValue && clsValue.trim() === className.trim()){
                isHasOnlyClass = true;
            }
        }
        return isHasOnlyClass;
    };
    
    /**
     * 判断元素是否包含一个正则表达式指定的类.
     * @method hasFuzzyClass
     */
    $.fn.hasFuzzyClass = function(classNameReg, isReturnMatch){    
        if(classNameReg){
            classNameReg = Type.isRegExp(classNameReg) ? classNameReg.source : classNameReg;
            if(!classNameReg.startsWith('\\b')){
                classNameReg = '\\b' + classNameReg;
            }
            if(!classNameReg.endsWith('\\b')){
                classNameReg += '\\b';
            }
            var match = $(this).get(0).className.match( new RegExp( classNameReg ) );
            return isReturnMatch === true ? match : !!match; 
        }
    };
    
    /**
     * 判断元素是否可见.
     */
    $.fn.isVisible = function(){
        return $(this).is(':visible');
    };
    
    //元素的宽度与高度互换.
    $.fn.swapWidthAndHeight = function(){  
        var $self = $(this), width = $self.width();                
        $self.css( 'width', $self.height() ).css( 'height', width );
        return this;
    };
})(jQuery);